// Copyright 2010, Vanya Davidenko.
// Используемая кодировка: UTF-8.

#ifndef LIBV_SIZEOF_PTR_H_
#define LIBV_SIZEOF_PTR_H_

#include <libv/static_assert.h>

/** @file Набор макросов, определяющих размер указателя (архитектуру)
  * на этапе работы препроцессора.
  * Предназначено для 3 компиляторов: MSVC, GCC и Intel
  * в операционных системах: Windows и Linux
  * для платформ: x86 и x86_64.
  *
  * Полученное значение проверяется на этапе компиляции с помощью STATIC_ASSERT.
  *
  * http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx
  * http://blog.onesadcookie.com/2007/07/useful-gcc-macros.html
  * http://software.intel.com/sites/products/documentation/studio/composer/en-us/2009/compiler_c/bldaps_cls/cppug_ccw/bldaps_macros_win.htm */


#if defined(_WIN32)
#  if defined(_WIN64)
#    define LIBV_SIZEOF_PTR 8
#  elif defined(_WIN16)
#    error "This header can only be used on 32/64 bit systems."
#  else
#    define LIBV_SIZEOF_PTR 4
#  endif

#elif defined(__GNUC__)
#  if defined(__x86_64__) || defined(__x86_64)
#    define LIBV_SIZEOF_PTR 8
#  else
#    define LIBV_SIZEOF_PTR 4
#  endif

#elif defined(__INTEL_COMPILER)  // Intel\Linux
#  if defined(_M_IX86)
#    if defined(_M_IA64) || defined(_M_AMD64)
#      define LIBV_SIZEOF_PTR 8
#    else
#      define LIBV_SIZEOF_PTR 4
#    endif
#  else
#    error "This header can only be used on x86 or x86_64 platforms."
#  endif

#else
#  error "This header can only be used with MSVC, GCC and Intel C++ compilers."
#endif  // _WIN32


// Проверка (в рантайме) правильности макроса.
LIBV_STATIC_ASSERT(sizeof(void*) == LIBV_SIZEOF_PTR);

#endif  // LIBV_SIZEOF_PTR_H_
